package br.ucb.ucblive.managedbean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import br.ucb.ucblive.HIB.DisciplinaHIB;
import br.ucb.ucblive.HIB.PostagemHIB;
import br.ucb.ucblive.HIB.TopicoHIB;
import br.ucb.ucblive.HIB.UsuarioHIB;
import br.ucb.ucblive.beans.Disciplina;
import br.ucb.ucblive.beans.Postagem;
import br.ucb.ucblive.beans.Topico;
import br.ucb.ucblive.beans.Usuario;
import br.ucb.ucblive.recursos.Functions;
import br.ucb.ucblive.recursos.MensagemConfirmacao;

@SessionScoped
@ManagedBean (name="topicoManagedBean")
public class TopicoManagedBean {
	private Topico topico;
	private List<Topico> topicos;
	private TopicoHIB topicoHib;
	private Disciplina disciplina;
	private List<Disciplina> disciplinas;
	private Usuario usuarioLogin;
	private UsuarioHIB usuarioHib;
	private Postagem postagem;
	private Postagem postagemPai;
	private List<Postagem> postagens;
	private PostagemHIB postagemHib;
	private boolean editPostagem;
	private boolean respondePostagem;
	private MensagemConfirmacao mensagemConfirmacao;
	private boolean postagemAlterada;
	private boolean topicoAlterado;
	
	public TopicoManagedBean(){
		setTopico(new Topico());
		setTopicos(new ArrayList<Topico>());
		setTopicoHib(new TopicoHIB());
		setDisciplina(new Disciplina());
		setUsuarioHib(new UsuarioHIB());
		setUsuarioLogin(usuarioHib.consultar
				   (FacesContext.getCurrentInstance().
					getExternalContext().getUserPrincipal().getName()
					));
		setPostagem(new Postagem());
		setPostagemPai(new Postagem());
		setPostagemHib(new PostagemHIB());
		setPostagens(new ArrayList<Postagem>());
		setMensagemConfirmacao(new MensagemConfirmacao());
		setEditPostagem(false);
		setPostagemAlterada(false);
		setTopicoAlterado(false);
	}

	
	public boolean isTopicoAlterado() {
		return topicoAlterado;
	}


	public void setTopicoAlterado(boolean topicoAlterado) {
		this.topicoAlterado = topicoAlterado;
	}


	public boolean isPostagemAlterada() {
		return postagemAlterada;
	}


	public void setPostagemAlterada(boolean postagemAlterada) {
		this.postagemAlterada = postagemAlterada;
	}


	public MensagemConfirmacao getMensagemConfirmacao() {
		return mensagemConfirmacao;
	}


	public void setMensagemConfirmacao(MensagemConfirmacao mensagemConfirmacao) {
		this.mensagemConfirmacao = mensagemConfirmacao;
	}


	public Topico getTopico() {
		return topico;
	}

	public void setTopico(Topico topico) {
		this.topico = topico;
	}

	public List<Topico> getTopicos() {
		return topicos;
	}

	public void setTopicos(List<Topico> topicos) {
		this.topicos = topicos;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}

	public TopicoHIB getTopicoHib() {
		return topicoHib;
	}

	public void setTopicoHib(TopicoHIB topicoHib) {
		this.topicoHib = topicoHib;
	}
	
	public Disciplina getDisciplina() {
		return disciplina;
	}

	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}

	public Usuario getUsuarioLogin() {
		return usuarioLogin;
	}

	public void setUsuarioLogin(Usuario usuarioLogin) {
		this.usuarioLogin = usuarioLogin;
	}
	
	public UsuarioHIB getUsuarioHib() {
		return usuarioHib;
	}

	public void setUsuarioHib(UsuarioHIB usuarioHib) {
		this.usuarioHib = usuarioHib;
	}
	
	public Postagem getPostagem() {
		return postagem;
	}

	public void setPostagem(Postagem postagem) {
		this.postagem = postagem;
	}

	public Postagem getPostagemPai() {
		return postagemPai;
	}

	public void setPostagemPai(Postagem postagemPai) {
		this.postagemPai = postagemPai;
	}

	public List<Postagem> getPostagens() {
		return postagens;
	}

	public void setPostagens(List<Postagem> postagens) {
		this.postagens = postagens;
	}

	public PostagemHIB getPostagemHib() {
		return postagemHib;
	}

	public void setPostagemHib(PostagemHIB postagemHib) {
		this.postagemHib = postagemHib;
	}
	
	public boolean isEditPostagem() {
		return editPostagem;
	}

	public void setEditPostagem(boolean editPostagem) {
		this.editPostagem = editPostagem;
	}

	public boolean isRespondePostagem() {
		return respondePostagem;
	}

	public void setRespondePostagem(boolean respondePostagem) {
		this.respondePostagem = respondePostagem;
	}

	public void inserePostagem(){
		if(!isRespondePostagem()){
			if(postagem.getIdPostagem()==0)
				postagem.setDataCriacao(new Date());
			postagem.setDataAlteracao(new Date());
			postagem.setTopico(topico);
			postagem.setUsuario(usuarioLogin);
			postagemHib.salvar(postagem);
		}
		else{
			if(postagem.getIdPostagem()==0)
				postagem.setDataCriacao(new Date());
			postagem.setDataAlteracao(new Date());
			postagem.setTopico(topico);
			postagem.setUsuario(usuarioLogin);
			postagem.setIdPostagemPai(postagemPai);
			postagemHib.salvar(postagem);
		}
		setPostagem(new Postagem());
		setPostagemPai(new Postagem());
		setEditPostagem(false);
		setRespondePostagem(false);
		if(isPostagemAlterada()) getMensagemConfirmacao().postagemAlterada();
		else getMensagemConfirmacao().postagemEnviada();
		setPostagemAlterada(false);
		postagens = postagemHib.listarPostagensByTopico(topico);
	}
	
	public String insereTopico(){
		if(topico.getIdTopico()==0)
			getTopico().setDataCriacao(new Date());
		getTopico().setDataAlteracao(new Date());
		getTopico().setUsuario(usuarioLogin);
		getTopico().setDisciplina(disciplina);
		topicoHib.salvar(topico);
		setTopico(new Topico());
		setEditPostagem(false);
		if(isTopicoAlterado())getMensagemConfirmacao().topicoAlterado();
		else getMensagemConfirmacao().topicoCriado();
		setTopicoAlterado(false);
		setRespondePostagem(false);
		setTopicos(topicoHib.listarTopicosByDisciplina(disciplina));
		//return "/alu/topicoList?faces-redirect=true";
		return "/alu/topicoList";
	}
	
	public String  populaDisciplinas(){
		DisciplinaHIB disciplinaHib = new DisciplinaHIB();
		setDisciplinas(new ArrayList<Disciplina>());
		setEditPostagem(false);
		setRespondePostagem(false);
		disciplinas = disciplinaHib.listar();
		return "/pro/topicoForm?faces-redirect=true";
	}

	public String populaTopicos(){
		setTopico(new Topico());
		setPostagens(new ArrayList<Postagem>());
		setEditPostagem(false);
		setRespondePostagem(false);
		setTopicos(topicoHib.listarTopicosByDisciplina(disciplina));
		return "/alu/topicoList?faces-redirect=true";
	}

	public void populaPostagens(ActionEvent e){
		topico = (Topico) e.getComponent().getAttributes().get("topico");
		DisciplinaHIB disciplinaHib = new DisciplinaHIB();
		topico.getDisciplina().setDisciplinaCurso(disciplinaHib.listarCursoByDisciplina(disciplina.getIdDisciplina()));
		topico.getDisciplina().setDisciplinaProfessor(disciplinaHib.listarProfessorByDisciplina(disciplina.getIdDisciplina()));
		postagens = postagemHib.listarPostagensByTopico(topico);
		setEditPostagem(false);
		setRespondePostagem(false);
		setPostagem(new Postagem());
	}

	public String cadastraTopico(){
		if(topico.getIdTopico()<=0 || !topicoAlterado){
			setTopico(new Topico());
			setTopicoAlterado(false);
		}
		else{
			setTopicoAlterado(true);
		}
		setPostagens(new ArrayList<Postagem>());
		setEditPostagem(false);
		setRespondePostagem(false);
		return "/pro/topicoForm.jsf";
	}
	
	public void excluirTopico(ActionEvent e){
		topicoHib.excluir(topico);
		setTopico(new Topico());
		setTopicos(new ArrayList<Topico>());
		setEditPostagem(false);
		setRespondePostagem(false);
		getMensagemConfirmacao().topicoExcluido();
		setTopicos(topicoHib.listarTopicosByDisciplina(disciplina));
	}
	
	public void editarPostagem(ActionEvent e){
		postagem = (Postagem) e.getComponent().getAttributes().get("postagem");
		setEditPostagem(true);
		setRespondePostagem(false);
		setPostagemAlterada(true);
		Functions.atualizarPagina();
	}
	
	public void responderPostagem(ActionEvent e){
		setPostagem(new Postagem());
		postagemPai = (Postagem) e.getComponent().getAttributes().get("postagemPai");
		setRespondePostagem(true);
		setEditPostagem(false);
		Functions.atualizarPagina();
	}
	
	public void excluirPostagem(ActionEvent e){
		if(((Postagem) e.getComponent().getAttributes().get("postagem")) instanceof Postagem)
			postagem = (Postagem) e.getComponent().getAttributes().get("postagem");
		postagemHib.excluir(postagem);
		setPostagem(new Postagem());
		setPostagens(new ArrayList<Postagem>());
		setEditPostagem(false);
		setRespondePostagem(false);
		getMensagemConfirmacao().postagemExcluida();
		postagens = postagemHib.listarPostagensByTopico(topico);
	}
}
